package com.zmn.mcc.business.impl.dpermit.cube;

import com.zmn.common.utils.collection.CollectionUtil;
import com.zmn.cube.common.dro.menu.MenuDRO;
import com.zmn.manager.common.database.annotation.ReadOnlyConnection;
import com.zmn.mcc.business.interfaces.dpermit.cube.DpermitCubeMenuBService;
import com.zmn.mcc.common.constant.DpermitConsts;
import com.zmn.mcc.manager.utils.DpermitUtil;
import com.zmn.mcc.model.dto.dpermit.DpermitSimpleDO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author heguanghua
 * @since 2020/06/11 17:21
 */
@Service
public class DpermitCubeMenuBServiceImpl implements DpermitCubeMenuBService {
    protected Logger logger = LoggerFactory.getLogger(DpermitCubeMenuBServiceImpl.class);

    // region 取得全部一级、二级、三级菜单列表，一级和二级并列，三级为二级的子集

    @Override
    @ReadOnlyConnection
    public List<DpermitSimpleDO> listMenuAndDpermitChecked(Integer status, List<Integer> dpermitIds, List<MenuDRO> menus) {
        // 菜单进行排序，后面需要选中上级，无效会导致无法选中
        menus = menus.stream().sorted(Comparator.comparing(MenuDRO::getLevel).reversed()
                .thenComparing(MenuDRO::getParentId).reversed()
                .thenComparing(MenuDRO::getSort).reversed()
                .thenComparing(MenuDRO::getMenuId).reversed()).collect(Collectors.toList());

        List<DpermitSimpleDO> items = new ArrayList<>();

        // 菜单ID和简单菜单对象的映射关系
        Map<Integer, DpermitSimpleDO> map = new HashMap<>();

        // 一级、二级、三级菜单列表
        //List<CubeMenu> menus = cubeMenuService.listAboveByLevel(DpermitConsts.CUBE_LEVEL_THRE, status);
        for (MenuDRO dept : menus) {

            // 防止数据错误抛出异常
            if (dept.getLevel() == null) {
                continue;
            }

            // 简单菜单对象
            DpermitSimpleDO simple = this.parseToDpermitSimpleDO(dept);

            // 加入映射关系map
            if (dept.getLevel() == DpermitConsts.CUBE_LEVEL_THRE) {
                map.put(simple.getDataId(), simple);
            }

            // 选中已分配
            if (CollectionUtil.isNotNullOrEmpty(dpermitIds) && dpermitIds.contains(simple.getDataId())) {
                simple.setChecked(true);
            }

            // 一级、二级加入主列表
            if (dept.getLevel() <= DpermitConsts.CUBE_LEVEL_THRE) {
                items.add(simple);
            }
            // 三级加入二级菜单的子集
            else if (dept.getLevel() == DpermitConsts.CUBE_LEVEL_FOUR) {
                DpermitSimpleDO parent = map.get(simple.getParentId());
                if (parent != null) {
                    parent.getSubors().add(simple);
                }
            }
        }

        return items;
    }
    // endregion

    // region 取得全部一级、二级、三级菜单的层级列表

    @Override
    public List<DpermitSimpleDO> listMenuTreeAndDpermitChecked(Integer status, List<Integer> dpermitIds, List<MenuDRO> menus) {
        // 菜单进行排序，后面需要选中上级，无效会导致无法选中
        menus = menus.stream().sorted(Comparator.comparing(MenuDRO::getLevel).reversed()
                .thenComparing(MenuDRO::getParentId).reversed()
                .thenComparing(MenuDRO::getSort).reversed()
                .thenComparing(MenuDRO::getMenuId).reversed()).collect(Collectors.toList());
        List<DpermitSimpleDO> items = new ArrayList<>();

        // 菜单ID和简单菜单对象的映射关系
        Map<Integer, DpermitSimpleDO> map = new HashMap<>();

        // 一级、二级、三级菜单列表
        //List<CubeMenu> menus = cubeMenuService.listAboveByLevel(DpermitConsts.CUBE_LEVEL_THRE, status);
        for (MenuDRO menu : menus) {

            // 防止数据错误抛出异常
            if (menu.getLevel() == null) {
                continue;
            }

            // 简单菜单对象
            DpermitSimpleDO simple = this.parseToDpermitSimpleDO(menu);

            // 一级、二级加入映射关系map
            if (menu.getLevel() <= DpermitConsts.CUBE_LEVEL_THRE) {
                map.put(simple.getDataId(), simple);
            }

            // 选中已分配
            if (CollectionUtil.isNotNullOrEmpty(dpermitIds) && dpermitIds.contains(simple.getDataId())) {
                simple.setChecked(true);
            }

            // 一级加入主列表
            if (menu.getLevel() == DpermitConsts.CUBE_LEVEL_ONE) {
                items.add(simple);
            }
            // 加入上级菜单的子集
            else if (menu.getLevel() >= DpermitConsts.CUBE_LEVEL_TWO) {
                DpermitSimpleDO parent = map.get(simple.getParentId());
                if (parent != null) {
                    parent.getSubors().add(simple);
                }
            }
        }

        /**
         * 检查并处理简单数据对象选中状态
         * 下级部分选中则上级选中，下级全部选中则对上级标识
         */
        DpermitUtil.checkSelected(items, false);
        return items;
    }
    // endregion


    /**
     * 转换为简单数据权限对象
     *
     * @param menu
     * @return
     */
    private DpermitSimpleDO parseToDpermitSimpleDO(MenuDRO menu) {
        if (menu == null) {
            return null;
        }
        DpermitSimpleDO simple = new DpermitSimpleDO();
        simple.setDataId(menu.getMenuId());
        simple.setDataName(menu.getMenuName());
        simple.setParentId(menu.getParentId());
        simple.setStatus(menu.getStatus());
        simple.setLevel(menu.getLevel());
        return simple;
    }
}
